package main

import (
	"flag"
	"fmt"
	"os"
)

/*
  读取键盘输入
*/
func main() {

	//scan()
	//ScanlnTest()
	//scanfTest()
	getArgsByFlag()

}

//使用 flag 包获取传入的命令行参数
func getArgsByFlag() {
	var user string
	var password string
	var host *string
	var port int
	flag.StringVar(&user, "u", "", "用户名")
	flag.StringVar(&password, "pwd", "", "密码")
	host = flag.String("h", "", "主机地址")
	flag.IntVar(&port, "p", -1, "端口")

	//解析收到的参数
	flag.Parse()
	fmt.Println("读取到参数:")
	fmt.Printf("user=%v\npassword=%v\nhost=%v\nport=%v\n", user, password, *host, port)
}

//获取命令行参数【通过go build 后的可执行文件运行时传的参数】
func getArgs() {
	args := os.Args
	for i, v := range args {
		fmt.Println("第", i, "个参数:", v)
	}
}

/**
 	默认读取
	Scan()接受任意多个参数，读取输入时，以换行或空格作为分割，如果数量不对，则报告错误
*/
func scan() {
	var name string
	var address string
	n, err := fmt.Scan(&name, &address)
	fmt.Println(name)
	fmt.Println(address)
	// 参数数量
	fmt.Println(n)
	fmt.Println(err)
}

/*
	按指定的格式输入
*/
func scanfTest() {
	fmt.Println("请输入姓名和年龄，空格隔开")
	var name string
	var age int
	n, err := fmt.Scanf("%s %d", &name, &age)
	//请输入姓名和年龄，空格隔开
	//wang 2
	//姓名: wang 年龄: 2
	fmt.Println("姓名:", name, "年龄:", age)
	// 接收到的参数数量
	fmt.Println(n)
	// 如果只输入一个变量，则会报错:newline in input does not match format
	fmt.Println(err)
}

/**
从键盘读取行数据
*/
func ScanlnTest() {
	var name string
	var age int
	fmt.Println("请输入姓名:")
	fmt.Scanln(&name)
	fmt.Println("请输入年龄:")
	// 如果读取到的类型和对应的变量不一致，则变量值为零值
	fmt.Scanln(&age)
	fmt.Println("姓名:", name, "年龄:", age)
}
